package course

import (
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"github.com/elastic/go-elasticsearch/v7/esapi"
	"strings"
	"yangming-college/app/speciality/cmd/v1/api/internal/svc"
	"yangming-college/app/speciality/cmd/v1/api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type ReviseCourseLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewReviseCourseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ReviseCourseLogic {
	return &ReviseCourseLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *ReviseCourseLogic) ReviseCourse(uid int64, req *types.ReqReviseCourse) error {
	// 判断文档是否存在
	exists, err := documentExistsByUIDAndID(uid, req.Id, l.svcCtx.ESClinet)
	if err != nil {
		return err
	}

	if exists {
		// 文档存在，执行修改逻辑
		return l.updateDocument(req)
	} else {
		// 文档不存在，可以执行相应的处理，如返回错误或者进行其他操作
		return errors.New("Document not found")
	}
}

// updateDocument 根据文档 ID 更新文档内容
func (l *ReviseCourseLogic) updateDocument(req *types.ReqReviseCourse) error {
	// 准备 Update 请求
	reqUpdate := esapi.UpdateRequest{
		Index:      "course",
		DocumentID: req.Id,
		Body:       strings.NewReader(fmt.Sprintf(`{"doc": %s}`, toJSON(req))),
	}

	// 执行 Update 请求
	resUpdate, err := reqUpdate.Do(context.Background(), l.svcCtx.ESClinet)
	if err != nil {
		return err
	}
	defer resUpdate.Body.Close()

	if resUpdate.IsError() {
		return errors.New(fmt.Sprintf("Error updating document: %s", resUpdate.String()))
	}

	return nil
}

// toJSON 将结构体转换为 JSON 字符串
func toJSON(data interface{}) string {
	jsonData, err := json.Marshal(data)
	if err != nil {
		return ""
	}
	return string(jsonData)
}
